package com.imut.lagain.repository;

import com.imut.lagain.entity.SensoryExercise;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 感官练习数据访问层
 */
@Mapper
public interface SensoryExerciseRepository extends BaseMapper<SensoryExercise> {

    /**
     * 根据用户ID查询感官练习记录
     */
    List<SensoryExercise> findByUserId(@Param("userId") Long userId);

    /**
     * 根据用户ID和会话ID查询感官练习
     */
    List<SensoryExercise> findByUserIdAndSessionId(@Param("userId") Long userId, @Param("sessionId") Long sessionId);

    /**
     * 根据用户ID和练习类型查询
     */
    List<SensoryExercise> findByUserIdAndExerciseType(@Param("userId") Long userId, @Param("exerciseType") String exerciseType);

    /**
     * 根据用户ID和状态查询
     */
    List<SensoryExercise> findByUserIdAndStatus(@Param("userId") Long userId, @Param("status") String status);

    /**
     * 根据用户ID和时间范围查询
     */
    List<SensoryExercise> findByUserIdAndDateRange(@Param("userId") Long userId,
                                                   @Param("startDate") LocalDateTime startDate,
                                                   @Param("endDate") LocalDateTime endDate);

    /**
     * 根据练习ID查询
     */
    SensoryExercise findByExerciseId(@Param("exerciseId") Long exerciseId);

    /**
     * 更新练习进度
     */
    @Update("UPDATE sensory_exercise SET completion_rate = #{completionRate}, status = #{status}, updated_at = #{updatedAt} WHERE id = #{exerciseId}")
    int updateProgress(@Param("exerciseId") Long exerciseId,
                       @Param("completionRate") Double completionRate,
                       @Param("status") String status,
                       @Param("updatedAt") LocalDateTime updatedAt);

    /**
     * 完成练习
     */
    @Update("UPDATE sensory_exercise SET status = 'completed', completed_at = #{completedAt}, anxiety_after = #{anxietyAfter}, grounding_score = #{groundingScore}, updated_at = #{updatedAt} WHERE id = #{exerciseId}")
    int completeExercise(@Param("exerciseId") Long exerciseId,
                         @Param("completedAt") LocalDateTime completedAt,
                         @Param("anxietyAfter") Integer anxietyAfter,
                         @Param("groundingScore") Integer groundingScore,
                         @Param("updatedAt") LocalDateTime updatedAt);

    /**
     * 更新感官项目
     */
    @Update("UPDATE sensory_exercise SET see_items = #{seeItems}, touch_items = #{touchItems}, hear_items = #{hearItems}, smell_items = #{smellItems}, taste_items = #{tasteItems}, updated_at = #{updatedAt} WHERE id = #{exerciseId}")
    int updateSensoryItems(@Param("exerciseId") Long exerciseId,
                           @Param("seeItems") String seeItems,
                           @Param("touchItems") String touchItems,
                           @Param("hearItems") String hearItems,
                           @Param("smellItems") String smellItems,
                           @Param("tasteItems") String tasteItems,
                           @Param("updatedAt") LocalDateTime updatedAt);

    /**
     * 统计用户练习次数
     */
    Long countByUserId(@Param("userId") Long userId);

    /**
     * 统计用户完成的练习次数
     */
    Long countCompletedByUserId(@Param("userId") Long userId);

    /**
     * 统计用户各类型练习次数
     */
    List<Map<String, Object>> countByUserIdAndExerciseType(@Param("userId") Long userId);

    /**
     * 查询用户平均练习时长
     */
    Double getAverageDurationByUserId(@Param("userId") Long userId);

    /**
     * 查询用户平均接地效果评分
     */
    Double getAverageGroundingScore(@Param("userId") Long userId);

    /**
     * 查询用户平均焦虑改善程度
     */
    Double getAverageAnxietyImprovement(@Param("userId") Long userId);

    /**
     * 查询用户平均完成率
     */
    Double getAverageCompletionRate(@Param("userId") Long userId);

    /**
     * 查询用户最近的练习记录
     */
    IPage<SensoryExercise> findRecentExercisesByUserId(@Param("userId") Long userId, Page<SensoryExercise> page);

    /**
     * 查询用户最喜欢的练习类型
     */
    List<String> getPreferredExerciseTypes(@Param("userId") Long userId);

    /**
     * 查询用户最有效的感官类型
     */
    List<String> getMostEffectiveSenses(@Param("userId") Long userId);

    /**
     * 查询未完成的练习
     */
    List<SensoryExercise> findIncompleteExercises(@Param("userId") Long userId);

    /**
     * 查询超时未完成的练习
     */
    List<SensoryExercise> findTimeoutExercises(@Param("timeoutThreshold") LocalDateTime timeoutThreshold);

    /**
     * 查询用户在特定环境下的练习效果
     */
    List<Map<String, Object>> getEffectivenessByEnvironment(@Param("userId") Long userId);
}
